From d79fbdeea97cd84335e822e27c29bfbe22167409 Mon Sep 17 00:00:00 2001 From: "arun.sharma@intel.com[kaf24]" Date: Thu, 23 Jun 2005 09:50:16 +0000 Subject: [PATCH] bitkeeper revision 1.1736 (42ba85d8Vh1WXA4F1eQpFRpsTyq1xg) [PATCH] sysenter-msr.patch Handle MSR reads/writes to sysenter related MSRs. Signed-off-by: Xiaofeng Ling Signed-off-by: Chengyuan Li Signed-off-by: Arun Sharma --- xen/arch/x86/vmx.c | 48 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index d4a16823eb..98ad41e5be 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -1009,8 +1009,23 @@ static inline void vmx_do_msr_read(struct cpu_user_regs *regs) VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_read: ecx=%lx, eax=%lx, edx=%lx", (unsigned long)regs->ecx, (unsigned long)regs->eax, (unsigned long)regs->edx); - - rdmsr(regs->ecx, regs->eax, regs->edx); + switch (regs->ecx) { + case MSR_IA32_SYSENTER_CS: + __vmread(GUEST_SYSENTER_CS, ®s->eax); + regs->edx = 0; + break; + case MSR_IA32_SYSENTER_ESP: + __vmread(GUEST_SYSENTER_ESP, ®s->eax); + regs->edx = 0; + break; + case MSR_IA32_SYSENTER_EIP: + __vmread(GUEST_SYSENTER_EIP, ®s->eax); + regs->edx = 0; + break; + default: + rdmsr(regs->ecx, regs->eax, regs->edx); + break; + } VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_read returns: " "ecx=%lx, eax=%lx, edx=%lx", @@ -1018,6 +1033,31 @@ static inline void vmx_do_msr_read(struct cpu_user_regs *regs) (unsigned long)regs->edx); } +static inline void vmx_do_msr_write(struct cpu_user_regs *regs) +{ + VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_write: ecx=%lx, eax=%lx, edx=%lx", + (unsigned long)regs->ecx, (unsigned long)regs->eax, + (unsigned long)regs->edx); + switch (regs->ecx) { + case MSR_IA32_SYSENTER_CS: + __vmwrite(GUEST_SYSENTER_CS, regs->eax); + break; + case MSR_IA32_SYSENTER_ESP: + __vmwrite(GUEST_SYSENTER_ESP, regs->eax); + break; + case MSR_IA32_SYSENTER_EIP: + __vmwrite(GUEST_SYSENTER_EIP, regs->eax); + break; + default: + break; + } + + VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_write returns: " + "ecx=%lx, eax=%lx, edx=%lx", + (unsigned long)regs->ecx, (unsigned long)regs->eax, + (unsigned long)regs->edx); +} + /* * Need to use this exit to reschedule */ @@ -1332,9 +1372,7 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs regs) break; case EXIT_REASON_MSR_WRITE: __vmread(GUEST_RIP, &eip); - VMX_DBG_LOG(DBG_LEVEL_1, "MSR_WRITE: eip=%lx, eax=%lx, edx=%lx", - eip, (unsigned long)regs.eax, (unsigned long)regs.edx); - /* just ignore this point */ + vmx_do_msr_write(®s); __get_instruction_length(inst_len); __update_guest_eip(inst_len); break; -- 2.30.2